home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-06-24 | 5.5 KB | 315 lines | [TEXT/QED1] |
- ; .VERBOSE
-
- MACRO MEA1 source,dest =
- LEA {source},A1
- MOVE.L A1,{dest}|
-
- MACRO TAS abs.W = ;left out of the assembler
- DC.W $4AF8,{abs.W}|
-
- IF 1 > 2 ;bug in MDS 2.0 & CDS 3.0
- X SET -1 ;listing indicator
- MACRO GT = < |
- MACRO GE = <=|
- MACRO LT = > |
- MACRO LE = >=|
- ELSE
- X SET -1 ;listing indicator
- MACRO GT = > |
- MACRO GE = >=|
- MACRO LT = < |
- MACRO LE = <=|
- ENDIF
-
- MACRO RECORD start,direction =
- _loc SET {start}+0
- _dir SET -1
- IF '{direction|0:1}'<>'D'
- IF '{direction|0:1}'<>'d'
- _dir SET +1
- ENDIF ;ELSE IF not in MDS 2.0
- ENDIF |
-
- MACRO VAR size = EQU _loc-(_dir=-1)*({size})
- FILL {size} |
-
- MACRO FILL size =
- _loc SET _loc+_dir*({size}) |
-
- MACRO ALGN o,m =
- _loc SET (_loc-({o})+_dir*(_dir*({o}-_loc) LT 0)*({m}-1))/({m})*({m})+{o}|
-
- MACRO ENDR = EQU _loc |
-
- ; INCLUDE FSPrivate.txt ;CDS version
- cacheCom EQU $39C
- noRWIPBit EQU 7
- INCLUDE Traps.D
- INCLUDE SysEquX.D
- INCLUDE FSEqu.D
- .TRAP _DebugStr $ABFF
- .TRAP _SCSIDispatch $A815
- scsiStat EQU 10
- .MACRO _SCSIStat
- MOVE #scsiStat,-(sp)
- _SCSIDispatch
- .ENDM
- BSY EQU 6
- SysHeap EQU $40
- Purgeable EQU $20
- Locked EQU $10
- Protected EQU $08
- Preload EQU $04
- Changed EQU $02
-
- SCSIGlobals EQU $C0C
- scsiBusy EQU $61
- sndRefNum EQU -4
- buffsize EQU 512*22
- N EQU 4 ;number of buffers
- vblSize EQU vblPhase+2
- ffMode EQU 0
- saveTemp EQU ioFileType ;convenient location
-
- RECORD 0,INCREMENT
- orlen VAR 4
- orptr VAR 4
- rate VAR 4
- datahndl VAR 4
- codehndl VAR 4
- taskcount VAR 2
- ALGN 0,4 ;for '020 efficiency
- hdrsize ENDR
-
- RECORD 0,INCREMENT
- FILL ioQElSize
- vblQEl1 VAR vblSize
- sndPB VAR ioQElSize
- vblQEl2 VAR vblSize
- FILL 4 ;for rate -- mode overlaps vblPhase
- readbuff VAR buffsize
- overrun VAR 368
- ALGN 0,4 ;for '020 efficiency
- blksize ENDR
-
- ratevalue EQU $00010000
-
- RESOURCE 'sysz' 0
- DC.L (codeend-codestart)+1024+hdrsize+N*blkSize
-
-
- RESOURCE 'INIT' 128 'AsyncInit' SysHeap+Locked
- codestart
- JMP install
- DC.W 'Copyright © 1990 Harvey Grosser'
-
-
- readcomp:
- MOVEQ #$FF-(1<<noRWIPBit),D1 ;mask to preserve other bits
- OR.B saveTemp(A0),D1 ;get saved value
- AND.B D1,CacheCom ;clear it if it was cleared before
-
- countR EQU D1
- ovR EQU D2
-
- MOVE.L A3,-(A7)
- MOVE.L ioOwnBuf(A0),A3
- MOVE.L orlen(A3),ovR
- MOVE.L ioActCount(A0),countR
- MOVE.L orptr(A3),A1
- CMP.L ovR,countR
- BGT.S @gtov
-
- SUBQ.W #1,taskcount(A3)
- BNE.S @more
- LEA @closed,A1
- MOVE.L A1,ioCompletion(A0)
- _Close ,ASYNC
- BRA.S @restore
-
- @more
- CLR.L orlen(A3)
- LEA readbuff(A0),A0
- MOVE.L countR,D0
- _BlockMove
- ADDA.L countR,A1
- SUB.L countR,ovR
-
- MOVE.L #$80808080,D0
- MOVEQ #3,D1
- AND.W ovR,D1
- BRA.S @1
- @0 MOVE.B D0,(A1)+
- @1 DBRA D1,@0
- LSR.W #3,ovR
- BCS.S @3
- BRA.S @4
- @2 MOVE.L D0,(A1)+
- @3 MOVE.L D0,(A1)+
- @4 DBRA ovR,@2
-
- BRA.S @restore
- @gtov
- ;amount read is greater than previous overrun
- LEA readbuff(A0),A0
- MOVE.L ovR,D0
- _BlockMove
- ;LEA -6(A0,ovR),A1 ;gets assembled incorrectly...
- LEA -6(A0,D2),A1 ;... so repeat it
- LEA sndPB-readbuff(A0),A0
- MOVE.L A1,ioBuffer(A0)
- CLR.W (A1)+ ;ffMode
- MOVE.L rate(A3),(A1)+
- SUB.L ovR,countR ;amount left in buffer
- ADDA.L countR,A1 ;point beyond data just read
- MOVE.L #370<<16,D2 ;largest possible dividend + 1
- SUB.L countR,D2
- DIVU #370,D2
- CLR.W D2
- SWAP D2
- ADD.L D2,countR
-
- MOVE.L A1,orptr(A3)
- MOVE.L ovR,orlen(A3)
-
- MOVE.L countR,ioReqCount(A0)
- _Write ,ASYNC
- @restore
- MOVE.L (A7)+,A3
- RTS
-
- @closed
- MOVE.L ioOwnBuf(A0),A1
- MOVE.L datahndl(A1),A0
- _HUnlock
- _HPurge
- MOVE.L codehndl(A1),A0
- _HUnlock
- _HPurge
- RTS
-
-
- sndcomp:
- BNE.S @done ;test for _KillIO
- LEA vblQEl1-sndPB(A0),A0
- MOVE.W #1,vblCount(A0)
- _VInstall
- @done MOVE.B #$80,SoundLevel ;eliminate end click on non-ASC machines
- RTS
-
-
- vbltask1:
- MOVE.L A0,A3
- TST.B FSBusy
- BNE.S vbltaskplus
- _Debugger
- MOVE.L SCSIGlobals,A1;
- TST.B scsiBusy(A1);
- ; MOVE.L #scsiStat<<16,-(A7)
- ; _SCSIDispatch
- ; MOVE.W (A7)+,D0
- ;BTST #BSY,D0
- ; TST.B D0
- BEQ.S vbltaskplus
- ADDQ.W #1,vblCount(A3)
- RTS
- vbltaskplus
- LEA vblQEl2-vblQEl1(A3),A0
- MOVE.W #1,vblCount(A0)
- LEA VBLQueue,A1
- _Enqueue
- RTS
-
-
- vbltask2:
- _VRemove
- BCLR #inVBL,VBLQueue+qFlags
- CLR.L (A0) ;qLink
- ST vblCount+1(A0)
- LEA -vblQEl2(A0),A0
- read
- TAS CacheCom ;test and set bit to disable caching
- SMI saveTemp(A0) ;save old value
- _Read ,ASYNC
- RTS
- compend
-
-
- openerr:
- MOVE.L datahndl(A3),A0
- MOVE.L D0,D1
- _DisposHandle
- MOVE.L D1,D0
- nomem:
- NEG.W D0
- MOVE.W D0,-(A7)
- _SysBeep
- RTS
-
- install:
- _HLock
- MOVE.L A0,D6
- MOVE.L #hdrsize+N*blkSize,D0
- MOVE.L D0,D1
- _ResrvMem ,SYS
- MOVE.L D1,D0
- _NewHandle ,SYS
- BNE nomem
- _HLock
- MOVEA.L (A0),A3
- MOVE.L A3,A2
- MOVEQ #(hdrsize+readbuff)/4-1,D0
- @clr CLR.L (A2)+
- DBRA D0,@clr ;A2 points to readbuff
-
- MOVE.W #N,taskcount(A3)
- MOVE.L A0,datahndl(A3)
- MOVE.L D6,codehndl(A3)
- MOVE.L #ratevalue,rate(A3)
-
- LEA hdrsize(A3),A0
- MEA1 'StartupSound',ioFileName(A0)
- MOVE.B #fsRdPerm,ioPermssn(A0)
- _HOpen ;we'll eventually specify a DirID
- BNE openerr
- MEA1 readcomp,ioCompletion(A0)
- MOVE.L A3,ioOwnBuf(A0)
- MOVE.L A2,ioBuffer(A0) ;points to readbuff
- MOVE.L #buffsize,ioReqCount(A0)
- ; ;CLR.W ioPosMode(A0) ;= fsAtMark
- MOVE.W #sndRefNum,sndPB+ioRefNum(A0)
- MEA1 sndcomp,sndPB+ioCompletion(A0)
- MOVE.W #vType,vblQEl1+qType(A0)
- MOVE.W #vType,vblQEl2+qType(A0)
- MEA1 vbltask2,vblQEl2+vblAddr(A0)
-
- LEA vbltaskplus,A2
- TST.W ROM85
- BMI.S @plus
- ;MOVE.L ROMBase,A1
- ;CMPI.W #$0075,8(A1)
- ;BEQ.S @plus
- LEA vbltask1,A2
- @plus MOVE.L A2,vblQEl1+vblAddr(A0)
-
- BSR read
- MOVEQ #N-2,D1
- MOVE.L #blksize,D5
- @top
- MOVE.L #readbuff,D0
- LEA 0(A0,D5.L),A1
- _BlockMove
- ADD.L D5,ioBuffer(A1)
- MOVE.L A1,A0
- BSR read
- DBRA D1,@top
- MOVE.L D6,-(A7)
- _DetachResource
- MOVE.L D6,A0
- MOVE.L #compend-codestart,D0
- _SetHandleSize
- RTS
- codeend
- END
-
-